﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;

using Microsoft.AnalysisServices.AdomdClient;

namespace KoOLAP_TestWinForms
{
    public class BI_SQL_MainPanel
    {

        #region Common

        public static string MakeDT_Y_M(int Year, int Month)
        {
            return string.Format("{0:0000}{1:00}", Year, Month);
        }

        #endregion

        public static Exception Exec(ref CellSet parCst, string parConnStr, string parCmdStr)
        {
            Exception ret = null;
            try
            {
                using (AdomdConnection conn = new AdomdConnection(parConnStr))
                {
                    conn.Open();
                    using (AdomdCommand cmd = new AdomdCommand(parCmdStr, conn))
                    {
                        parCst = cmd.ExecuteCellSet();
                        conn.Close();
                    }
                }
            }
            catch (Exception err)
            {
                parCst = null;
                ret = new Exception(err.Message, err);
            }

            return ret;
        }

        public static Exception GetPlanResume(ref DataTable tbl, string parConnStr, int parYear, int parMonth)
        {
            Exception ret = null;
            string MonthStr = MakeDT_Y_M(parYear, parMonth);
/*
SELECT 
{
    [Measures].[Оборот7 Руб]
    ,[Measures].[План на месяц]
    ,[Measures].[Прогноз7 руб]
    ,[Measures].[Откл-е прогноза %]
} 
DIMENSION PROPERTIES PARENT_UNIQUE_NAME 
,HIERARCHY_UNIQUE_NAME ON COLUMNS 
, NON EMPTY 
Hierarchize(
{
    DrilldownLevel({
        [Номенклатура].[Секция].[Все]
    }
    ,,,INCLUDE_CALC_MEMBERS)}) 
DIMENSION PROPERTIES PARENT_UNIQUE_NAME
,HIERARCHY_UNIQUE_NAME ON ROWS 
FROM
(
SELECT ({
    [Номенклатура].[Секция].&[ПОДГУЗНИКИ]
    , [Номенклатура].[Секция].&[ОДЕЖДА]
    , [Номенклатура].[Секция].&[ОБУВЬ]
    , [Номенклатура].[Секция].&[МЕБЕЛЬ]
    , [Номенклатура].[Секция].&[КОСМЕТИКА]
    , [Номенклатура].[Секция].&[ИГРУШКИ]
    , [Номенклатура].[Секция].&[ДЕТСКОЕ ПИТАНИЕ]}) 
ON COLUMNS  FROM (
SELECT ({
    [Номенклатура].[Иерархия номенклатуры].[Секция].&[ПОДГУЗНИКИ]
    ,[Номенклатура].[Иерархия номенклатуры].[Секция].&[ОДЕЖДА]
    ,[Номенклатура].[Иерархия номенклатуры].[Секция].&[ОБУВЬ]
    ,[Номенклатура].[Иерархия номенклатуры].[Секция].&[МЕБЕЛЬ]
    ,[Номенклатура].[Иерархия номенклатуры].[Секция].&[КОСМЕТИКА]
    ,[Номенклатура].[Иерархия номенклатуры].[Секция].&[ИГРУШКИ]
    ,[Номенклатура].[Иерархия номенклатуры].[Секция].&[ДЕТСКОЕ ПИТАНИЕ]}) 
ON COLUMNS  
FROM [KPI])) 
WHERE ([Дата].[Г-М-Д].[Месяц].&[201112]) 
CELL PROPERTIES VALUE
, FORMAT_STRING
, LANGUAGE
, BACK_COLOR
, FORE_COLOR
, FONT_FLAGS
*/
            string cmdStr =
@"
SELECT 
{
	[Measures].[Оборот7 Руб]
	,[Measures].[План на месяц]
	,[Measures].[Прогноз7 руб]
	,[Measures].[Откл-е прогноза %]
} 
DIMENSION PROPERTIES PARENT_UNIQUE_NAME 
,HIERARCHY_UNIQUE_NAME ON COLUMNS 
, NON EMPTY 
Hierarchize(
{
	DrilldownLevel({
		[Номенклатура].[Секция].[Все]
	}
	,,,INCLUDE_CALC_MEMBERS)}) 
DIMENSION PROPERTIES PARENT_UNIQUE_NAME
,HIERARCHY_UNIQUE_NAME ON ROWS 
FROM
(
SELECT ({
	[Номенклатура].[Секция].&[ПОДГУЗНИКИ]
	, [Номенклатура].[Секция].&[ОДЕЖДА]
	, [Номенклатура].[Секция].&[ОБУВЬ]
	, [Номенклатура].[Секция].&[МЕБЕЛЬ]
	, [Номенклатура].[Секция].&[КОСМЕТИКА]
	, [Номенклатура].[Секция].&[ИГРУШКИ]
	, [Номенклатура].[Секция].&[ДЕТСКОЕ ПИТАНИЕ]}) 
ON COLUMNS  FROM (
SELECT ({
	[Номенклатура].[Иерархия номенклатуры].[Секция].&[ПОДГУЗНИКИ]
	,[Номенклатура].[Иерархия номенклатуры].[Секция].&[ОДЕЖДА]
	,[Номенклатура].[Иерархия номенклатуры].[Секция].&[ОБУВЬ]
	,[Номенклатура].[Иерархия номенклатуры].[Секция].&[МЕБЕЛЬ]
	,[Номенклатура].[Иерархия номенклатуры].[Секция].&[КОСМЕТИКА]
	,[Номенклатура].[Иерархия номенклатуры].[Секция].&[ИГРУШКИ]
	,[Номенклатура].[Иерархия номенклатуры].[Секция].&[ДЕТСКОЕ ПИТАНИЕ]}) 
ON COLUMNS  
FROM [KPI])) 
WHERE ([Дата].[Г-М-Д].[Месяц].&[" + MonthStr + @"]) 
CELL PROPERTIES VALUE
, FORMAT_STRING
, LANGUAGE
, BACK_COLOR
, FORE_COLOR
, FONT_FLAGS
";

            CellSet cst = null;
            Exception err = Exec(ref cst, parConnStr, cmdStr);

            if (err != null)
                ret = new Exception(err.Message);
            else
            {
                err = Parse_001(ref cst, ref tbl);
                if (err != null)
                    ret = new Exception(err.Message);
            }

            return ret;
        }        

        public static Exception Parse_001(ref CellSet parCst, ref DataTable parTbl)
        {
            Exception ret = null;
            MakeTbl_001(ref parTbl);

            #region Init

            // check if any axes were returned else throw error.
            int axes_count = parCst.Axes.Count;
            if (axes_count == 0)
                return new Exception("No data returned for the selection");

            // if axes count is not 2
            if (axes_count != 2)
                return new Exception("The sample code support only queries with two axes");

            // if no position on either row or column throw error
            if (!(parCst.Axes[0].Positions.Count > 0) && !(parCst.Axes[1].Positions.Count > 0))
                return new Exception("No data returned for the selection");

            #endregion

            #region Members

            int cur_row, cur_col, col_count, row_count, col_dim_count, row_dim_count;
            cur_row = cur_col = col_count = row_count = col_dim_count = row_dim_count = 0;

            // Number of dimensions on the column
            col_dim_count = parCst.Axes[0].Positions[0].Members.Count;

            // Number of dimensions on the row
            if (parCst.Axes[1].Positions[0].Members.Count > 0)
                row_dim_count = parCst.Axes[1].Positions[0].Members.Count;

            // Total rows and columns
            row_count = parCst.Axes[1].Positions.Count + col_dim_count;  //number of rows + rows for column headers
            col_count = parCst.Axes[0].Positions.Count + row_dim_count;  //number of columns + columns for row headers

            int count = 0;
            DataRow r = null;

            #endregion

            #region for

            for (cur_row = 0; cur_row < row_count - 1; cur_row++)
            {

                count++;
                if (count >= 1)
                    r = parTbl.NewRow();
                else
                    continue;

                string Name = parCst.Axes[1].Positions[cur_row].Members[0].Caption;
                //string strValueType = parCst.Axes[1].Positions[cur_row].Members[1].Caption;


                #region Data

                Decimal val1 = Convert.ToDecimal(parCst[0, cur_row].Value);
                Decimal val2 = Convert.ToDecimal(parCst[1, cur_row].Value);
                Decimal val3 = Convert.ToDecimal(parCst[2, cur_row].Value);
                Decimal val4 = Convert.ToDecimal(parCst[3, cur_row].Value);

                r["Name"] = Name;
                r["Turnover"] = val1;
                r["Plan"] = val2;
                r["Forecast"] = val3;
                r["Deviation"] = val4;

                parTbl.Rows.Add(r);

                #endregion

            }

            #endregion

            return ret;
        }

        public static void MakeTbl_001(ref DataTable parTbl)
        {
            if (parTbl == null)
                parTbl = new DataTable();

            parTbl.Columns.Add("Name", typeof(string));
            parTbl.Columns.Add("Turnover", typeof(Decimal));
            parTbl.Columns.Add("Plan", typeof(Decimal));
            parTbl.Columns.Add("Forecast", typeof(Decimal));
            parTbl.Columns.Add("Deviation", typeof(Decimal));
        }

    }
}
